package com.lagou.server;

import com.lagou.model.QuestionMessage;
import com.lagou.model.User;
import com.lagou.model.UserMessage;

import java.io.IOException;
import java.util.List;

/**
 * 编程实现服务器的主功能
 */
public class ServerView {

    /**
     * 使用合成复用原则
     */
    private ServerInitClose sic;
    private ServerManagerDao smd;
    private List<User> userList;

    /**
     * 通过构造方法实现成员变量的初始化
     * @param sic
     */
    public ServerView(ServerInitClose sic, ServerManagerDao smd, List<User> userList) {
        this.sic = sic;
        this.smd = smd;
        this.userList = userList;
    }

    /**
     * 自定义成员方法实现客户端发来消息的接收并处理
     */
    public void serverReceive() throws IOException, ClassNotFoundException {
        while (true) {
            System.out.println("服务器等待数据的到来...");
            // 使用对象输入流来接收
            //UserMessage tum = (UserMessage) sic.getOis().readObject();
            Object obj = sic.getOis().readObject();
            System.out.println("服务器接收到的对象是：" + obj);
            if (obj instanceof UserMessage) {
                UserMessage tum = (UserMessage) obj;
                // 使用分支结构针对客户端发来的不同类型进行不同的处理
                switch (tum.getType()) {
                    case "managerCheck":
                        serverManagerCheck(tum);
                        break;
                    case "clientExit":
                        serverExit();
                        return;
                    case "clientAddUser":
                        serverAddUser(tum);
                        break;
                }
            }
            if (obj instanceof QuestionMessage) {
                QuestionMessage tqm = (QuestionMessage) obj;
            }
        }
    }

    public void serverManagerCheck(UserMessage tum) throws IOException {
        // 调用方法实现管理员账号和密码信息的校验
        if (smd.serverManagerDao(tum.getUser())) {
            tum.setType("success");
        } else {
            tum.setType("fail");
        }
        // 将校验结果发送给客户端
        sic.getOos().writeObject(tum);
        System.out.println("服务器发送校验结果成功！");
    }

    /**
     * 自定义成员方法实现服务器增加学员账户的功能
     * @param tum
     * @throws IOException
     */
    public void serverAddUser(UserMessage tum) throws IOException {
        // 判断集合中是否已存在该学员信息，若存在则添加失败
        for(User tu: userList) {
            if(tu.getUserName().equalsIgnoreCase(tum.getUser().getUserName())) {
                tum.setType("fail");
                sic.getOos().writeObject(tum);
                System.out.println("服务器发送添加学员结果成功！");
                return;
            }
        }
        // 若不存在则调用集合中add方法添加即可
        userList.add(tum.getUser());
        tum.setType("success");
        sic.getOos().writeObject(tum);
        System.out.println("服务器发送添加学员结果成功！");
    }

    /**
     * 自定义成员方法实现服务器的退出功能
     * @throws IOException
     */
    public void serverExit() throws IOException {
        sic.serverClose();
    }
}
